<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    li {
      line-height: 40px
    }
      span {
        color: red;
        font-weight: 600
      }
    </style>
</head>
<body>
  <h2>基础类型</h2>
  <ul>
    <li>TypeScript 中所有的数字都是浮点数</li>
    <li>
      <h3>Tuple</h3>
      <ul>
        <li>Tuple 元组类型允许表示一个已知元素数量和类型的数组，各元素的类型不必相同,但顺序一定要相同</li>
        <li>元组中当访问一个越界的元素，会使用联合类型替代（暂不考虑，什么是联合类型，什么是跨界问题还未清楚）</li>
      </ul>
    </li>
    <li>
      <h3>枚举类型 enum</h3>
      <ul>
        <li>enum类型是对JavaScript标准数据类型的一个补充,使用枚举类型可以为一组数值<span>赋予友好的名字。</span></li>
        <li>默认情况下，从0开始为元素编号。 你也可以手动的指定成员的数值</li>
        <li>枚举类型提供的一个便利是你可以由枚举的值得到它的名字。</li>
      </ul>
    </li>
    <li>
      <h3>any 类型</h3>
      <ul>
        <li>
          有时候，我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型, 这种情况下，我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。 那么我们可以使用 any类型来标记这些变量
        </li>
        <li>在对现有代码进行改写的时候，any类型是十分有用的，它允许你在编译时可选择地包含或移除类型检查,但是变量类型声明为 Object 却达不到这样的效果<span>(例如当你把数字 2 赋值给一个 Object 类型的变量，ts 检查器会提示出错。因为 Object 没有数字的方法，Number 类型才有，指定 any 类型，运行时可能会报错，但是是可以通过编译的)</span></li>
      </ul>
    </li>
    <li>
      <h3>void 类型</h3>
      <ul>
        <li>void类型表示没有任何类型，常用于无任何返回值的函数</li>
        <li>声明一个 void 变量通常没有太大意义，因为它只能被赋予 undefined 和 null</li>
      </ul>
    </li>
    <li>
      <h3>Null 和 Undefined</h3>
      <ul>
        <li>Null 和 Undefined类型本身作用并不大，因为只有两个值 null,和 undefined</li>
        <li>但是null 和 undefined 默认情况下是所有类型的子集，也就是说你可以把null和undefined赋值给number类型的变量。</li>
        <li>当你指定了--strictNullChecks(<span>建议尽可能的使用</span>)标记，null和undefined只能赋值给void和它们各自。 这能避免 很多常见的问题</li>
        <li>在某处你想传入一个 string或null或undefined，你可以使用联合类型string | null | undefined</li>
      </ul>
    </li>
    <li>
      <h3>never 类型(<span>暂时还没搞明白</span>)</h3>
      <ul>
        <li>never类型表示的是那些永不存在的值的类型</li>
        <li>never类型是任何类型的子类型，也可以赋值给任何类型,没有类型是never的子类型。除了 never 本身，没有变量可以赋值给 never</li>
        <li>never类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型</li>
      </ul>
    </li>
    <li>
      <h3>类型断言</h3>
      <ul>
        <li>当自己比 typeScript 检查器更清楚的知道类型的时候，会用到 类型断言</li>
        <li>
          作用是 让 ts 检查器<span>不进行(所以类型断言错了也没关系，编译也不会出现错误)</span>数据检查，它相信你已经做了足够正确的断言，只在编译阶段起作用，没有运行时候的影响
        </li>
        <li>
          断言的写法有两种，尖括号 + 类型 或者 as 语法，效果等价。其中jsx 只支持as 语法
        </li>
      </ul>
    </li>
    <li>另外，我们使用let关键字来代替大家所熟悉的JavaScript关键字var,很多常见的问题都可以通过使用 let来解决，所以尽可能地使用let来代替var吧</li>
  </ul>

  <h2>实战指南-类型与函数</h2>
  <ul>
    <li>
      TypeScript 核心就是 Type,基本类型与 Javacript 基本类型完全相同。
    </li>
    <li>
      TS 中不推荐使用 var 命名，使用 let const
    </li>
    <li>
      泛型用于提升代码的重要性。希望自己编写的代码不仅能支持当前的数据类型。而且也能支持将来的数据类型
    </li>
    <li>
      使用泛型参数时候，必须把这些参数当做是 <span>任意类型</span>，编译器会选择最糟糕的情况进行处理
    </li>
    <li>
      类型保护：typeScript里有一种类型保护机制，可以让代码可读性得到提升，同时还能减少使用复杂的类型断言
    </li>
    <li>
      要实现类型保护，只需要单独定义一个函数就可以，但返回值必须时一个主谓宾语句。也可以认为类型保护的作用就是为了区分明白类型，可以调用其中的方法，不至于typeScript编译的时候会报错。类型保护的作用时一旦确定类型，就可以在相应分支上调用其方法，而不需要每调用一次，就多写一次类型断言
    </li>
    <li>类型保护可以让你少写几次断言，但是并不能保证编译过后的JS运行不出现错误</li>
    <li>
      在TypeScript中，我们使用type关键字来描述类型变量。使用别名。typeof 匹配基本类型时，才会启用类型保护，instanceof 也可以起到类型保护的作用。用来判断对象
    </li>
    <li>类型别名可以用关键字来描述变量，使用关键字type，类型别名可以减少代码的编写量</li>
    <li>映射类型：TypeScript提供了从旧类型中创建新类型的一种方式，也就是”映射类型“。在映射类型里，新类型以相同的方式去转换旧类型里的每个属性</li>
    <li>
      只读和可选类型为typeScript内置类型（Readonly, Partial）
    </li>
    <li>typeScript结构化类型系统的基本原则是，如果x要兼容y，那么y至少具有与x相同的属性</li>
  </ul>
</body>
</html>